package net.xuele.learn.IO.netty.stickyBag;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.FixedLengthFrameDecoder;

/**
 * Created by GaoQingming on 2019/4/13 0013.
 *
 * TCP是一个“流”协议，所谓流，就是一大串数据。所以可能会出现一个完整的包被拆分多个包发送，也可能出现多个小的包被整合成一个大的包发送。
 * 与TCP的欢动窗口有关。
 *
 *  业界主流协议的解决方案：
 *             1、消息定长，不够则空格补位
 *             2、在包尾增加回车换行符进行分割
 *             3、将消息分为消息头和消息体，消息体中包含消息总长度的信息
 *
 *
 *             为了处理半包读写的问题，Netty默认提供了很多的编解码器用于处理半包。
 *
 *
 *  LineBasedFrameDecoder的工作原理是遍历ByteBuf中的可读字节，判断是否有"\n"或者“\r\n”，如果有，就以此位置为结束位置。
 *  是以换行符为结束符的解码器
 *
 *  StringDecoder将接收到的对象转换成字符串，然后调用后面的Handler
 *
 *
 *  DelimiterBasedFrameDecoder表示以指定的字符作为分隔符，代码如下，其中1024表示最大未读取到指定分隔符的长度，
 *  超过这个未读取到分隔符，就会报错
 *
 *
 *  FixedLengthFrameDecoder是固定长度解码器，他能按照指定的长度对消息进行自动解码。
 *
 *  上述二者都需要结合StringDecoder来使用的！！！
 */
public class ReadMe {
    public static void main(String[] args) {
        ByteBuf byteBuf = Unpooled.copiedBuffer("$_".getBytes());
        new DelimiterBasedFrameDecoder(1024,byteBuf);

        new FixedLengthFrameDecoder(1024);
    }
}
